#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>

using namespace std;

const double eps=1e-7;
const int maxn=105;
int dcmp(const double &d){if(fabs(d)<eps) return 0;return d>0?1:-1;}

struct Point{
    double x,y;
    Point(double x=0,double y=0):x(x),y(y){}
    const Point operator + (const Point &p) const{return Point(x+p.x,y+p.y);}
    const Point operator - (const Point &p) const{return Point(x-p.x,y-p.y);}
    const Point operator / (const double &d) const{return Point(x/d,y/d);}
    const bool operator != (const Point &p) const{return dcmp(x-p.x)||dcmp(y-p.y);}
    friend const Point operator * (const double &d,const Point &p){return Point(d*p.x,d*p.y);}
};
double dis(const Point &p){return p.x*p.x+p.y*p.y;}
double cross(const Point &p,const Point &q){return p.x*q.y-p.y*q.x;}
struct Line{
    Point u,v;
    double k;
    Line(const Point &u=Point(),const Point &v=Point()):u(u),v(v){}
    void getK(){k=atan2(v.y-u.y,v.x-u.x);}
    const bool operator < (const Line &l) const{
        int t=dcmp(k-l.k);
        if(t==0) return dcmp(cross(l.v-u,v-u))>0;
        else return t<0;
    }
    void shift(const double &r){
        Point vec=v-u;
        Point norm(-vec.y,vec.x);
        norm=norm/sqrt(dis(norm));
        norm=r*norm;
        u=u+norm;v=v+norm;
    }
};

double area(const Point &p,const Point &q,const Point &r){return cross(q-p,r-p);}
const Point inter(const Line &m,const Line &n){
    double k1,k2;
    k1=area(m.u,n.u,n.v);k2=area(n.u,m.v,n.v);
    return (k1*m.v+k2*m.u)/(k1+k2);
}
bool inHp(const Point &p,const Line &l){
    return dcmp(cross(l.v-l.u,p-l.u))>=0;
}
int hpi(Point *conv,Line *lne,const int &n){
    int tot,ans,f,r;
    int *q=new int[maxn];

    sort(lne,lne+n);
    tot=1;
    //printf("lne:\n");for(int i=0;i<n;i++) printf("%.4f,%.4f - %.4f,%.4f k=%.4f\n",lne[i].u.x,lne[i].u.y,lne[i].v.x,lne[i].v.y,lne[i].k);
    for(int i=1;i<n;i++) if(dcmp(lne[i].k-lne[i-1].k)) lne[tot++]=lne[i];
    f=r=0;
    q[r++]=0;q[r++]=1;
    //printf("tot=%d\n",tot);
    for(int i=2;i<tot;i++){
        while(f<r-1&&!inHp(inter(lne[q[r-1]],lne[q[r-2]]),lne[i])) r--;
        while(f<r-1&&!inHp(inter(lne[q[f]],lne[q[f+1]]),lne[i])) f++;
        q[r++]=i;
    }
    while(f<r-1&&!inHp(inter(lne[q[r-1]],lne[q[r-2]]),lne[q[f]])) r--;
    while(f<r-1&&!inHp(inter(lne[q[f]],lne[q[f+1]]),lne[q[r-1]])) f++;
    q[r]=q[f];
    tot=0;
    for(int i=f;i<r;i++) conv[tot++]=inter(lne[q[i]],lne[q[i+1]]);
    //printf("tot=%d\n",tot);
    ans=1;
    for(int i=1;i<tot;i++) if(conv[i]!=conv[i-1]) conv[ans++]=conv[i];
    while(ans>1&&(!(conv[ans-1]!=conv[0]))) ans--;
    return ans;
}
template <typename T>
bool update(T &x,T y){if(x<y) return x=y,true;return false;}
double RC(Point *pts,const int &n,int &p,int &q){
    int now=2;
    double ans=0;
    if(n==1) return p=q=0,0;
    else if(n==2) return p=0,q=1,dis(pts[0]-pts[1]);
    pts[n]=pts[0];
    for(int i=0;i<n;i++){
        while(dcmp(area(pts[i],pts[i+1],pts[now+1])-area(pts[i],pts[i+1],pts[now]))>0) now++,now%=n;
        if(update(ans,dis(pts[i]-pts[now]))) p=i,q=now;
        //printf("i=%d,now=%d\n",i,now);
    }
    return ans;
}

inline int read(){
    char c;int r;bool f=0;
    for(c=getchar();c>'9'||c<'0';c=getchar()) if(c=='-') f=1;
    for(r=0;c<='9'&&c>='0';c=getchar()) r=r*10+c-'0';
    if(f) return -r;
    else return r;
}

Point pts[maxn];
Line lne[maxn];

int main(){
    int n,r,cnt,p,q;

    n=read();r=read();
    for(int i=0;i<n;i++) {pts[i].x=read();pts[i].y=read();}
    pts[n]=pts[0];
    for(int i=0;i<n;i++) lne[i].v=pts[i],lne[i].u=pts[i+1],lne[i].getK();
    for(int i=0;i<n;i++) lne[i].shift(r);
    cnt=hpi(pts,lne,n);
    RC(pts,cnt,p,q);
    if(pts[p].x>pts[q].x) swap(p,q);
    //printf("cnt=%d\n",cnt);
    printf("%.4f %.4f %.4f %.4f\n",pts[p].x+eps,pts[p].y+eps,pts[q].x+eps,pts[q].y+eps);
    //for(int i=0;i<cnt;i++) printf("(%.4f,%.4f)\n",pts[i].x,pts[i].y);
    return 0;
}
